Пример SimplePermissionAttributeRequest показывает, как использовать атрибуты для выдачи запросов на те или иные разрешения. В этом примере атрибут нужен для того, чтобы передать метаданные в сборку, для запуска которой требуется разрешение Centres JLPrincipal. Таким образом можно заранее узнать, какие компоненты конфликтуют с политикой безопасности.
[assembly: Secur: i_t у Permission (
SecurityAc t ion: : RequestMinimum,
ControlPrinc:ipal=true) ] ;
public _gc class PermAttrib
// класс сборицхнгка мусора PermAttrib
{
public:
static int Imain()
В перечислении SecurityAction имеется
несколько значений, часть из которых можно
применягь к: классу или методу, а часть, как
в этом примере, — к сборке. К сборкам
применяются RequestMinimum, RequestOptional И RequestRefuse.
RequestMinimu-m указывает на те метаданные, чьи
разрешения необходимы для запуска сборки.
Reques-tOjptional указывает на те разрешения
метаданных, которые сборке неплохо бы им:еть.,
но без которых, впрочем, она все-таки может
выполняться. RequestRefuse указывает на те
разрешения, от которых сборка хотела бы
отказаться15.
Если в примере SimplePermissionAttributeRequest
значение атрибута поменять на RequestRefuse, а
затем этот пример запустить, то хотя сборка
и будет загружена, попытка изменить
политику приведет к запуску исключения
SecurityException.
Остальные значения применяются к
классам и методам. Значение LinkDemand нужно
тогда, когда делается ссылка на некоторый
тип. При этом требуется, чтобы
непосредственно вызвавшая программа имела
разрешение. Другие значения применяются во
время выполнения. InheritanceDemand требует, чтобы
разрешение имелось у производного класса.
Assert (Утвердить), Deny (Запретить), PermitOnly и Demand (Требование)
требуют именно то, что от них можно ожидать.
Вот пример требования FilelOPermission,
применяемого к классу с помощью атрибута.
Для файла требуется Al lAcce s s. Надо
обязательно указывать полный путь к файлу.
[FilelOPermission(
SecurityAction::Demand,
All = "c:\\foo\\read.txt")]
public class Simple
// общедоступный Простой класс
{
};